<?php

namespace app\index\controller;

use app\BaseController;
use think\facade\Log;
use think\facade\View;

use function Swoole\Coroutine\Http\request;

class Index extends BaseController
{
    public function convert()
    {
        View::assign('realIp', '');
        return View::fetch('convert3');
    }

    /**
     * 1、安装pdf转图片工具
     * yum install poppler-utils
     * 2、安装图片操作工具
     * yum install ImageMagick
     * 3、安装doc转pdf工具
     * yum install unoconv
     * 4、pdf转图片
     * pdftoppm -png test.pdf t1
     * 5、图片合并
     * convert t1-1.png t1-2.png -append b.png
     * 6、doc转pdf
     * unoconv pdf a.doc
     * 7、图片格式转换
     * convert input.jpg output.png
     * 8、图片压缩
     * convert input.jpg -quality 75 output.jpg
     * 9、视频格式转换
     * // 安装ffmpeg
     * git clone https: //git.ffmpeg.org/ffmpeg.git ffmpeg  获取ffmpeg源码
     * cd ffmpeg
     * ./configure
     * make
     * make install
     *  //格式转换
     * ffmpeg-i input.mp4 output.avi
     * //获取ffmpeg支持的格式
     * ffmpeg -formats
     * 10、视频压缩（需要安装libx264）
     * export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib //引入libx264
     * 常用压缩选项：
     *-c:v 或 -codec:v：指定视频编码器。libx264 是一个常用的编码器，适用于 H.264 视频编码。
     *-preset：指定编码预设，有 ultrafast、superfast、veryfast、faster、fast、medium（默认）、slow、slower、veryslow 等选项。预设越慢，编码效率越高，但编码时间也越长。
     *-crf 或 -constant_rate_factor：设置恒定比特率因子，控制输出视频的质量。CRF 值越低，质量越高，文件越大。常用的 CRF 值范围是 18 到 28。
     *-b:v 或 -bit_rate:v：设置视频的比特率。较低的比特率会导致更高的压缩，但也可能降低视频质量。
     *-bufsize 或 -buf_size：设置码率控制缓冲区的大小。与 -b:v 一起使用，可以控制视频的整体码率。
     *-movflags：设置 MP4/MOV 文件的特定标志，例如 +faststart 可以提高视频的加载速度。
     * ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 -movflags +faststart output.mp4
     *
     * @return string|\think\response\File|void
     */
    public function converting()
    {

        //pdf转png
        if (!empty($_FILES['pdf']['name'])) {
            $file = $_FILES['pdf'];
            $name = $file['name'];
            $type = $file['type'];
            $size = $file['size'];

            if (!in_array($type, ['application/pdf'])) {
                return '请上传正确的文件类型';
            }

            $temp_file = 'uploads/pdf/' . $name;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $fileName = pathinfo($name)['filename'];
            $path = public_path() . '/uploads/pdf/' . $name;
            $pngPath = public_path() . '/uploads/png/' . $fileName;

            //pdf转换为png图片
            exec('pdftoppm -png ' . $path . ' ' . $pngPath);


            //合并png图片为一张图
            $converStr = 'convert ';
            $directory = public_path() . '/uploads/png/'; // 替换为你的目录路径
            // 打开目录，并读取其中的文件和子目录
            $files = scandir($directory);
            // 遍历文件和目录数组
            $pngArr = [];
            foreach ($files as $file) {
                if ($file != "." && $file != "..") { // 排除当前目录和父目录
                    $newFileName = '';
                    $newFileName = pathinfo($file)['filename'];
                    if (strpos($newFileName, '-') && strpos($newFileName, $fileName) !== false && pathinfo($file)['extension'] == 'png') {
                        $conPngPth = public_path() . '/uploads/png/' . $file;
                        $converStr .= " $conPngPth ";
                        $pngArr[] = $conPngPth;
                    }
                }
            }

            $newName = time() . '.png';
            $newPath = public_path() . '/uploads/png/' . $newName;
            $converStr .= "-append $newPath";
            exec($converStr);

            exec("rm -rf $temp_file");
            foreach ($pngArr as $val) {
                exec("rm -rf $val");
            }
            return download($newPath, $newName);
        } else if (!empty($_FILES['doc']['name'])) {
            //doc转pdf
            $file = $_FILES['doc'];
            $name = $file['name'];
            $type = $file['type'];
            $size = $file['size'];

            if (!in_array($type, ['application/msword'])) {
                return '请上传正确的文件类型';
            }

            $newName = time() . '.' . pathinfo($name)['extension'];
            $temp_file = public_path() . 'uploads/doc/' . $newName;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $path = public_path() . '/uploads/doc/' . $newName;
            $pdfName = explode('.', $newName)[0] . '.pdf';
            $pdfPath = public_path() . '/uploads/doc/' . $pdfName;

            exec("unoconv pdf $path");

            exec("rm -rf $path");
            return download($pdfPath, $pdfName);
        } else if (!empty($_FILES['img']['name'])) {
            //图片转换
            $file        = $_FILES['img'];
            $name        = $file['name'];
            $type        = $file['type'];
            $toImgFormat = input('toImgFormat', 'png');

            if (!in_array($type, ['image/jpeg', 'image/png', 'image/jpg', 'image/gif', 'image/bmp'])) {
                return '请上传正确的文件类型';
            }

            $newName   = time() . '.' . pathinfo($name)['extension'];
            $temp_file = public_path() . 'uploads/img/' . $newName;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $path    = public_path() . '/uploads/img/' . $newName;
            $imgName = explode('.', $newName)[0] . '.' . $toImgFormat;
            $imgPath = public_path() . '/uploads/img/' . $imgName;

            exec("convert $temp_file $imgPath");

            exec("rm -rf $path");
            return download($imgPath, $imgName);
        } else if (!empty($_FILES['imgCompress']['name'])) {
            //图片压缩
            $file            = $_FILES['imgCompress'];
            $name            = $file['name'];
            $type            = $file['type'];
            $compressPersent = input('compressPersent', '50');  //参数设置输出图片的质量（1-100）。较低的值表示更低的品质和更小的文件大小。
            $compressType = input('compressType', ''); //y压缩类型dbl-等比例压缩，ys-有损压缩
            if (!in_array($type, ['image/jpeg', 'image/png', 'image/jpg', 'image/gif', 'image/bmp'])) {
                return '请上传正确的文件类型';
            }

            $newName   = time() . '_old.' . pathinfo($name)['extension'];
            $temp_file = public_path() . 'uploads/compress/' . $newName;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $path    = public_path() . '/uploads/compress/' . $newName;
            $imgName = explode('.', $newName)[0] . '_new.' . pathinfo($name)['extension'];
            $imgPath = public_path() . '/uploads/compress/' . $imgName;

            $exec = '';
            if ($compressType == 'ys') {
                $exec = "convert $temp_file -quality $compressPersent $imgPath";
            }

            if ($compressType == 'dbl') {
                $exec = "convert $temp_file -resize {$compressPersent}% $imgPath";
            }

            exec($exec);
            exec("rm -rf $path");
            return download($imgPath, $imgName);
        } else if (!empty($_FILES['video']['name'])) {
            //视频转换
            $file        = $_FILES['video'];
            $name        = $file['name'];
            $type        = $file['type'];
            $toVideoFormat = input('toVideoFormat', 'png');

            if (!in_array($type, ['video/mp4', 'video/mpeg', 'video/avi', 'video/webm', 'video/3gpp'])) {
                return '请上传正确的文件类型';
            }

            $newName   = time() . '.' . pathinfo($name)['extension'];
            $temp_file = public_path() . 'uploads/video/' . $newName;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $path    = public_path() . '/uploads/video/' . $newName;
            $videoName = explode('.', $newName)[0] . '.' . $toVideoFormat;
            $videoPath = public_path() . '/uploads/video/' . $videoName;

            exec("ffmpeg -i $temp_file $videoPath");


            exec("rm -rf $path");
            return download($videoPath, $videoName);
        } else if (!empty($_FILES['videoCompress']['name'])) {
            //视频压缩
            // libx264编码器，这是最常用的编码器之一，其CRF值的范围通常是从0到51。
            // CRF值的含义如下：
            // CRF 0：无损压缩，质量最高，文件大小最大。
            // CRF 23：通常被认为是高质量的压缩，适用于大多数用途，提供了良好的质量和相对较小的文件大小。
            // CRF 28：默认值，提供了一个平衡的质量和文件大小。
            // CRF 51：最差的压缩质量，文件大小最小，质量损失最大。
            // CRF值越低，输出视频的质量越高，文件大小也越大。相反，CRF值越高，视频质量越低，文件大小越小。
            $file            = $_FILES['videoCompress'];
            $name            = $file['name'];
            $type            = $file['type'];
            $crf = input('crf', 'png');  //参数设置输出视频的质量（0-51）。较低的值表示更低的品质和更小的文件大小。
            if (!in_array($type, ['video/mp4', 'video/mpeg', 'video/avi', 'video/webm', 'video/3gpp'])) {
                return '请上传正确的文件类型';
            }

            $newName   = time() . '_old.' . pathinfo($name)['extension'];
            $temp_file = public_path() . 'uploads/compressVideo/' . $newName;

            // 将上传的文件移动到临时文件
            if (!move_uploaded_file($file['tmp_name'], $temp_file)) {
                echo "无法将上传的文件移动到临时文件";
                exit;
            }

            $path    = public_path() . '/uploads/compressVideo/' . $newName;
            $videoName = explode('.', $newName)[0] . '_new.' . pathinfo($name)['extension'];
            $videoPath = public_path() . '/uploads/compressVideo/' . $videoName;

            // 准备参数数组
            $args = [$temp_file, $crf, $videoPath];
            // 将参数转换为字符串
            $arguments = implode(' ', $args);
            // 执行Shell脚本并传递参数
            $command = public_path() . "/ffm.sh $arguments";
            $output = shell_exec($command);


            // $str = "nohup ffmpeg -i $temp_file -c:v libx264 -preset medium -crf $crf -movflags +faststart output.mp4 &";
            // exec($str);
            // sleep(30);

            exec("rm -rf $path");
            return download($videoPath, $videoName);
        }

        return '请上传正确的文件';
    }

    function getRealIpAddr($server)
    {
        if (!empty($server['HTTP_CLIENT_IP']))   //check ip from share internet
        {
            $ip = $server['HTTP_CLIENT_IP'];
        } elseif (!empty($server['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
        {
            $ip = $server['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $server['REMOTE_ADDR'];
        }
        return $ip;
    }
}
